package com.qq.文件_io_字符.io2.缓冲流.字节缓冲流;

import java.io.*;

/*

	缓冲流（缓冲区）概述：
	缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。
	在内存里自带一个8192B的缓冲池子，如果想读外存里的东西，直接在池子里拿，不用跑去外存。
	
	读数据时：它先用原始字节输入流一次性读取8KB的数据存入缓冲流内部的数组中（ps: 先一次多囤点货）里面存的是一个一个字节
	再从8KB的字节数组中读取一个字节或者多个字节（把消耗屯的货）。
	
	写数据时： 它是先把数据写到缓冲流内部的8BK的数组中（ps: 先攒一车货），
	等数组存满了，再通过原始的字节输出流，一次性写到目标文件中去（把囤好的货，一次性运走）。
	
	作用：缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能，
	其实就是加一个人和你同时工作，所以效率变高了
	
	字节缓冲流性能优化原理：
	字节缓冲输入流自带了8KB缓冲池，以后我们直接从缓冲池读取数据，所以性能较好。
	字节缓冲输出流自带了8KB缓冲池，数据就直接写入到缓冲池中去，写数据性能提高了。
	
	字节缓冲流：
	字节缓冲输入流：BufferedInputStream(InputStream is)
	字节缓冲输出流：BufferedOutputStream​(OutputStream os)
	功能没变化，就是性能提高了，相当于升级版

    目标：使用字节缓冲流完成数据的读写操作。
 */
public class ByteBuffer_Test{
    public static void main(String[] args) {

        try (
                // 这里面只能放置资源对象，用完会自动关闭：自动调用资源对象的close方法关闭资源（即使出现异常也会做关闭操作）
                // 1、创建一个字节输入流管道与原视频接通
                InputStream is = new FileInputStream("D:\\JAVA学习\\乱七八糟\\文件操作\\源文件\\社会主义改造.mp4");
                // a.把原始的字节输入流包装成高级的缓冲字节输入流
                InputStream bis = new BufferedInputStream(is);//File 变成 Buffered
                // 2、创建一个字节输出流管道与目标文件接通
                OutputStream os = new FileOutputStream("D:\\JAVA学习\\乱七八糟\\文件操作\\目标文件\\社会主义改造.mp4");
                // b.把字节输出流管道包装成高级的缓冲字节输出流管道
                OutputStream bos = new BufferedOutputStream(os);
        		
        ) {

            // 3、定义一个字节数组转移数据
            byte[] buffer = new byte[1024];
            int len; // 记录每次读取的字节数。
            while ((len = bis.read(buffer)) != -1){
                bos.write(buffer, 0 , len);
            }
            System.out.println("复制完成了！");

        } catch (Exception e){
            e.printStackTrace();
        }

    }
}
